package services;

import domain.entities.ComiteDocenciaDAO;
import domain.entities.ContactPerson;
import domain.entities.ContactPersonDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import domain.entities.ComiteDocencia;

import java.util.ArrayList;
import java.util.List;

@Service
public class TeachingCommitteeCRUDService implements CRUDService<ComiteDocencia>{

    private ComiteDocenciaDAO dao;
    private ContactPersonDAO contactPersondDAO;

    public TeachingCommitteeCRUDService() {
    }

    @Autowired
    public TeachingCommitteeCRUDService(ComiteDocenciaDAO dao, ContactPersonDAO contactPersondDAO) {
        this.dao = dao;
        this.contactPersondDAO = contactPersondDAO;
    }

    @Override
    public <V extends Criteria> List<ComiteDocencia> list(V criteria) {
        return dao.findAll();
    }

    public void delete(ComiteDocencia comiteDocencia){
        dao.delete(comiteDocencia);
    }

    public void deleteContactPersonById(int id) {
        ContactPerson person = contactPersondDAO.findById(id);
        if (person != null && person.getComiteDocencia() != null){
            contactPersondDAO.delete(person);
        }
    }

    public ComiteDocencia findById(int id) {
        return dao.findById(id);
    }

    public void save(ComiteDocencia comiteDocencia) {
        ComiteDocencia persisted = null;
        if(comiteDocencia.getId() != null){
            persisted = dao.findById(comiteDocencia.getId());
            for(ContactPerson cp : persisted.getContactPersons()){
                contactPersondDAO.delete(cp);
            }
        }
        ArrayList<ContactPerson> cps = new ArrayList<ContactPerson>(0);
        for(ContactPerson cp : comiteDocencia.getContactPersons()){
            if(cp == null)
                cps.add(cp);
            else
                cp.setComiteDocencia(comiteDocencia);
        }

        comiteDocencia.getContactPersons().removeAll(cps);


        dao.attachDirty(comiteDocencia);
    }

}
